<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!-- -->
    <div class="box">
        <p>
            <label for="">用户名:</label>
            <input type="text" id="user">
            <span id="user_span"></span>
        </p>
        <p>
            <label for="">密&emsp;码:</label>
            <input type="text" id="pwd">
            <span id="pwd_span"></span>
        </p>
        <p>
            <label for="">确&emsp;认:</label>
            <input type="text" id="repwd">
            <span id="repwd_span"></span>
        </p>
        <p>
            <label for="">验证码:</label>
            <input type="text" id="code">
            <span id="createCode">a1b2</span>
            <span id="code_span"></span>
        </p>
        <p>
            <input id="btn" type="submit" value="注册">
        </p>
    </div>
</body>
<script>
    // 用户名
    // 由数字 大小写字母 _ $ 组成 , 6-12位,且不能以数字开头

    // 判断的流程  从易到难的顺序
    // a. 长度  6-12位    =>  失败:用户名需要在6-12位之间
    // b. 不能以数字开头   =>  失败:用户名不能以数字开头
    // c. 由数字 大小写字母 _ $ 组成  (所有的字符都必须在合法字符的范围内,只要有一个不是合法的字符 报错   => 判断字符串中是否能含有非法字符)


    // 密码
    // 由数字 大小写字母 _ 组成   6-12位

    // 判断密码强度
    // 数字,大写,小写,特殊字符  中 只出现一种   11111   aaaaaa  AAAAAA   弱
    // 数字,大写,小写,特殊字符  中 出现2种      11111a  a1111   aAAAAA   中
    // 数字,大写,小写,特殊字符  中 出现3种      1aA                      强
    // 数字,大写,小写,特殊字符  中 出现4种      1aA_                     超强

    // 是否存在数字  / 大写 /小写 / 特殊字符

    // true + true + true + false  => 3

    // 确认密码
    // 和密码相同   => 两次密码输入不一致

    // 验证码  => 封装一个方法可以随机生成四位验证码 (0-9 a-z A-Z )
    // 1. 页面加载时,随机生成四个不重复的验证码 (0-9 a-z A-Z )   => createCode
    // 2. 点击 验证码 进行切换
    // 3. 验证码输入判断  (输入的  随机生成的  保持一致) 






</script>
<script>
    var userInp = document.getElementById("user");
    var userSpan = document.getElementById("user_span");

    var pwdInp = document.getElementById("pwd");
    var pwdSpan = document.getElementById("pwd_span");

    var repwdInp = document.getElementById("repwd");
    var repwdSpan = document.getElementById("repwd_span");

    var codeInp = document.getElementById("code");
    var codeSpan = document.getElementById("code_span");
    var createCode = document.getElementById("createCode");

    var btn = document.getElementById("btn");

    // 注意:
    // JS操作元素改变样式时,都是通过内联样式实现的
    //  <span id="user_span" style="font-size:12px;color: red;"></span>
    // userSpan.style

    // 用户名
    // 由数字 大小写字母 _ $ 组成 , 6-12位,且不能以数字开头

    // 判断的流程  从易到难的顺序
    // a. 长度  6-12位    =>  失败:用户名需要在6-12位之间
    // b. 不能以数字开头   =>  失败:用户名不能以数字开头
    // c. 由数字 大小写字母 _ $ 组成  (所有的字符都必须在合法字符的范围内,只要有一个不是合法的字符 报错   => 判断字符串中是否能含有非法字符)

    // 编码 (ASCII 编码)
    // 数字  48 - 57    charCode>=48 && charCode <= 57
    // 大写  65 - 90    charCode>=65 && charCode <= 90 
    // 小写  97 - 122    charCode>=97 && charCode <= 122 
    // _ $   95   36    charCode==95 || charCode==36

    // 合法范围    
    // (charCode>=48 && charCode <= 57 || charCode>=65 && charCode <= 90 ||  charCode>=97 && charCode <= 122  ||  charCode==95 || charCode==36)

    // 非法范围 
    // !(charCode>=48 && charCode <= 57 || charCode>=65 && charCode <= 90 ||  charCode>=97 && charCode <= 122  ||  charCode==95 || charCode==36)


    btn.onclick = function () {
        var user = userInp.value;

        // 用户名长度验证
        if (user.length >= 6 && user.length <= 12) {

            // 首字母验证  =>  用户名不能以数字开头 (非数字开头)
            var firstChar = user.charAt(0);
            // if (!(firstChar >= 0 && firstChar <= 9)) {
            //     userSpan.innerText = "√";
            //     userSpan.style.fontSize = "12px";
            //     userSpan.style.color = "green";
            // } else {
            //     userSpan.innerText = "用户名不能以数字开头";
            //     userSpan.style.fontSize = "12px";
            //     userSpan.style.color = "red";
            // }


            if (isNaN(firstChar)) {  // 非数字 => true


                // 判断字符组成  由数字 大小写字母 _ $ 组成  (所有的字符都必须在合法字符的范围内,只要有一个不是合法的字符 报错   => 判断字符串中是否能含有非法字符)



                var flag = true; // 假设都是合法的

                for (var i = 0; i < user.length; i++) {
                    var charCode = user.charCodeAt(i);
                    if (!(charCode >= 48 && charCode <= 57 || charCode >= 65 && charCode <= 90 || charCode >= 97 && charCode <= 122 || charCode == 95 || charCode == 36)) {  // 如果存在非法字符
                        flag = false;
                        break;
                    }
                }
                if (flag) {
                    userSpan.innerText = "√";
                    userSpan.style.fontSize = "12px";
                    userSpan.style.color = "green";
                } else {
                    userSpan.innerText = "用户名由数字、字母、下划线、$组成";
                    userSpan.style.fontSize = "12px";
                    userSpan.style.color = "red";
                }




            } else {
                userSpan.innerText = "用户名不能以数字开头";
                userSpan.style.fontSize = "12px";
                userSpan.style.color = "red";
            }


        } else {
            userSpan.innerText = "用户名需要在6-12位之间";
            userSpan.style.fontSize = "12px";
            userSpan.style.color = "red";
        }

    }




</script>

</html>